Windows NFS协议漏洞分析(CVE-2022-34715)
更多安全资讯和分析文章请关注启明星辰ADLab微信公众号及官方网站(adlab.venustech.com.cn)
研究背景
2022年8月9日,微软发布了月度安全更新,共修补121个漏洞,包括PPP协议、SMB协议、NFS协议等远程代码漏洞。启明星辰ADLab对其中的NFS漏洞(CVE-2022-34715)进行了漏洞分析与验证。
协议简介
NFSv4有NULL 和COMPOUND两种RPC procedures,其中NULL发送一个空请求。NFSv4的功能被定义为一组操作(operation),这些操作被封装在COMPOUND procedures中,客户端在发送请求时将一个或多个操作合并到一个请求中,这是为了防止服务器端在处理客户端一组联系紧密的请求时由于延迟等原因造成问题。
COMPOUND的结构如下:
补丁对比
漏洞位于服务端驱动程序nfssvr.sys,对补丁前后(10.0.20348.825和10.0.20348.8)的代码进行比对,可以定位到漏洞函数Nfs4SrvAclBuildWindowsAclsFromNfsAcl。
函数Nfs4SrvAclBuildWindowsAclsFromNfsAcl在调用NfsMemMgrBufferAllocate前,先对参数3进行了验证,如果该值大于0xffffffff,则不再进行内存分配。
IDA上可以看到更直观的结果。
漏洞验证
从函数名Nfs4SrvAclBuildWindowsAclsFromNfsAcl可以推测漏洞是由于修改文件的权限导致的acl变更。通过查找rfc7530的文档我们发现SETATTR 操作可以符合要求。
在发送SETATTR 操作之前需具备前置条件,我们需要有一个客户端可控的文档,以便修改文档权限,同时还需要与服务器端建立连接,并获取文件的句柄,之后即可发送修改权限数据包。
rfc7530文档对SETATTR Request的描述如下:
其中,attrlist4是一个不透明的数组用于文件和目录的属性。通过这些信息我们构造一个SetAttr数据包,并通过windbg对目标服务器进行调试,调试器成功的断在了Nfs4SrvAclBuildWindowsAclsFromNfsAcl函数上。通过逆向我们确定v9的数据来自函数的参数1即rcx。
由此,我们可以在调试器里查看v9的具体内容。
对比发送的数据包,我们可以得知v9是SETATTR操作中的ACE count。
通过修改ACE count为0x8000001,使其左移5位正好溢出。
然后发送数据包进行尝试,目标服务器崩溃。
小 结
CVE-2022-34715漏洞原因是服务器在处理NFSv4的SETATTR操作时没有对其ACE count的大小进行校验,攻击者可以传入恶意数据导致服务器处理驱动nfssvr整数溢出,进而引发堆溢出。补丁程序通过检查ACE count左移5位之后的数值是否发生了整数溢出来判断客户端数据是否会导致服务器堆溢出。
启明星辰积极防御实验室(ADLab)
ADLab成立于1999年,是中国安全行业最早成立的攻防技术研究实验室之一,微软MAPP计划核心成员,“黑雀攻击”概念首推者。截止目前,ADLab已通过CVE累计发布安全漏洞近1100个,通过 CNVD/CNNVD累计发布安全漏洞2000余个,持续保持国际网络安全领域一流水准。实验室研究方向涵盖操作系统与应用系统安全研究、移动智能终端安全研究、物联网智能设备安全研究、Web安全研究、工控系统安全研究、云安全研究。研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。